<?php if(!defined('BASEPATH')) exit('No direct script access allowed');

class Mail_send extends Admin_Controller
{

	public function __construct()
	{
		parent::__construct();

		if (!$this->auth->is_logged_in())
		{
			$this->session->set_flashdata('info', '<div class="notification info">Bu sayfa üyelerimize özeldir.</div>');
			redirect('/');
		}

		$this->load->helper('string');

		$this->load->library('email');

		$this->load->model(array('subscriber_model', 'subscriber_group_model', 'mail_template_model', 'sent_model', 'sent_group_model', 'sent_item_model'));
	}

	public function index()
	{
		self::prepare_send();
	}

	public function send()
	{
		if (empty($_POST))
		{
			// get subscriber groups
			$groups = dropdown_fromdb("SELECT id, name FROM _subscriber_group WHERE user_id = {$this->auth->uid()}");

			// mail templates
			$templates = dropdown_fromdb("SELECT id, name FROM _mail_template WHERE user_id = {$this->auth->uid()}");
			
			// genders
			$genders = $this->config->item('genders');

			// DATA
			$data = array(
				'groups' => $groups, 
				'templates' => $templates,
				'genders' => $genders
			);

			$this->template->load('mail_send/send', $data);
		}
		else
		{
			// VALIDATION
			$this->load->library('form_validation');
			$this->form_validation->set_rules('groups[]', 'Gurup', 'trim|callback__group_check|callback__check_subscribers|callback__check_credit');
			$this->form_validation->set_rules('genders[]', 'Cinsiyet', 'trim');
			$this->form_validation->set_rules('template_id', 'Şablon', 'trim|required|numeric');
			$this->form_validation->set_rules('from_name', 'Kimden İsim', 'trim|required|htmlspecialchars|max_length[255]');
			$this->form_validation->set_rules('from_email', 'Kimden E mail', 'trim|required|valid_email');
			$this->form_validation->set_rules('reply_name', 'Cevap İsim', 'trim|required|htmlspecialchars|max_length[255]');
			$this->form_validation->set_rules('reply_email', 'Cevap E mail', 'trim|required|valid_email');
			$this->form_validation->set_rules('subject', 'Konu', 'trim|required|xss_clean|max_length[255]');
			//$this->form_validation->set_rules('file', 'Ataç dosya', 'trim|callback__file_check');

			if (!$this->form_validation->run())
			{
				$ajax_data = array('error' => true, 'msg' => $this->form_validation->error_string());
				exit(json_encode($ajax_data));
			}

			// CONTINUE

			// get template content
			$template = $this->mail_template_model->get($this->input->post('template_id'));

			$attach = NULL;
			
			$curdate = date('Y-m-d H:i:s');
			
			// additional data
			
			// genders
			$d_genders = array();
			foreach ($this->input->post('genders') as $key)
			{
				$d_genders[] = array('id' => $key, 'name' => $this->config->item($key, 'genders'));
			}

			// insert sent_table
			$data = array(
				'user_id' => $this->auth->uid(), 
				'from_name' => $_POST['from_name'], 
				'from_email' => $_POST['from_email'], 
				'reply_name' => $_POST['reply_name'], 
				'reply_email' => $_POST['reply_email'], 
				'subject' => $_POST['subject'], 
				'content' => $template->content, 
				'attach' => $attach,
				'data' => serialize(array('genders' => $d_genders)), 
				'date_add' => $curdate
			);

			$sent_id = $this->sent_model->add($data);
			
			// insert sent_item table
			
			$q = $this->db
				->select('SQL_CALC_FOUND_ROWS *', FALSE)
				->from('subscriber')
				->where(array('status' => '1', 'confirm' => '1'))
				->where_in('group_id', $this->input->post('groups'))
				->where_in('gender', $this->input->post('genders'))
				->get();

			$data = array();

			foreach ($q->result() as $row)
			{
				$data[] = array(
					'sent_id' => $sent_id, 
					'group_id' => $row->group_id, 
					'firstname' => $row->firstname, 
					'lastname' => $row->lastname,
					'gender' => $row->gender,
					'address' => $row->address, 
					'date_add' => $curdate
				);
			}

			$this->sent_item_model->add_batch($data);
			
			// insert _sent_group table
			$groups = $this->db->where_in('id', $this->input->post('groups'))->get('subscriber_group')->result();
			foreach ($groups as $group)
			{
				$this->sent_group_model->add(array('sent_id' => $sent_id, 'group_id' => $group->id, 'group_name' => $group->name));
			}			
			
			set_notify('Gönderiminiz Başlatıldı.');
			
			$json = array(
				'error' => FALSE,
				'msg'   => 'Gönderiminiz başlatıldı.',
				'redirect' => site_url('backend/sent/index')
			);

			ajax_response($json);
		}
	}

	/**
	 * İPTAL!!!
	 * sent_items tablosundaki token alanı için benzersiz bir işaret oluşturur.
	 * abonelikten çıkma ve okundu bilgileri bunu referans alır.
	 *
	 * @return string
	 */
	private function generate_token()
	{
		return $token = random_string('unique');

		// sunucu göçmesinden dolayı tokenın veritabanında varlığı kontrol edilmiyor.
		do
		{
			$token = random_string('unique');

			$has = $this->sent_item_model->has(array('where' => array('token' => $token)));
		}
		while ($has);

		return $token;
	}

	/**
	 * Gönderi konularındaki <, > karekterlerini escape eder.
	 * (htmlspeacialchars & gibi karekterleride &amp; a çevirdiğinden alternatif olarak üretildi)
	 *
	 * @param string $subject
	 */
	private function _clean_subject(&$subject)
	{
		$search = array('<', '>');
		$replace = array('&lt;', '&gt;');

		$subject = str_replace($search, $replace, $subject);
	}

	/* CALLBACKS FUNCTIONS */

	/**
	 * Kullanıcının farklı bir kullanıcının gurubuna veya olmayan bir guruba mail göndermesine karşı
	 * söz konusu gurubun gerçekten var olduğu ve kullanıcıya ait olup olmadığını kontrol eder.
	 *
	 * @param int $group_id
	 * @return bool
	 */
	public function _group_check()
	{
		$i = $this->db
			->where(array('user_id' => $this->auth->uid()))
			->where_in('id', (array)$this->input->post('groups'))
			->count_all_results('subscriber_group');

		if (!$i)
		{
			$this->form_validation->set_message('_group_check', 'Böyle bir gurup yok!');
			return false;
		}

		return true;
	}

	/**
	 * Ataç dosyanın gerçekten bir dosya olupolmadığını kontrol eder.
	 *
	 * @param string $file
	 * @return bool
	 */
	public function _file_check($file)
	{
		// attach dosya yüklenmemişsse direk true gönder
		if ($file == '')
			return true;

		if (!file_exists($file))
		{
			$this->form_validation->set_message('_file_check', 'Ataç dosya geçersiz.' . $file);
			return false;
		}

		$_POST['file'] = $file;
		return true;
	}

	/**
	 * Maillerin kuyruğa eklenmeden önce kullanıcını göndereceği mail kadar kredisinin
	 * bulunup bulunmadığı kontrol ediliyor. Örneğin kullanıcı 100 mail atacaksa 100 kredisinin olması gerekiyor.
	 * Böylelikle hiç kredisi bulunmayan kullanıcılar boş yere sistemi yoramayacaklar.
	 */
	public function _check_credit()
	{
		$groups = $this->input->post('groups');

		$i = $this->db
			->from('subscriber AS s')
			->where(array(
				's.user_id' => $this->auth->uid(),
				's.status' => '1',
				's.confirm' => '1'
			))
			->where_in('s.group_id', $groups)
			->count_all_results();

		if($i > $this->auth->get_credit())
		{
			$this->form_validation->set_message('_check_credit', 'Yeterli Bakiyeniz Yok');
			return FALSE;
		}

		return TRUE;
	}
	
	/**
	 * Seçilen guruplarda minimum 1 abone olup olmadığını kontrol eder
	 */
	public function _check_subscribers()
	{
		$groups = $this->input->post('groups');
		$genders = $this->input->post('genders');

		$i = $this->db
			->from('subscriber AS s')
			->where(array(
				's.user_id' => $this->auth->uid(),
				's.status' => '1',
				's.confirm' => '1'
			))
			->where_in('s.group_id', $groups)
			->where_in('s.gender', $genders)
			->count_all_results();

		if(!$i)
		{
			$this->form_validation->set_message('_check_subscribers', 'Hiç aboneniz yok. Öncelikle abone eklemelisiniz');
			return FALSE;
		}

		return TRUE;
	}	

}

/* End of file Mail_send.php */
